package high.concurrent.strategy;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;

/**
 * 标准分片下：水平分表策略
 * RangeShardingAlgorithm<Long> Long是因为分片键是Long型的
 */
public class CustomTablePreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> {

    /**
     * @param dataSourceNames 数据源集合
     *                      在分库时值为所有分片库的集合 databaseNames
     *                      分表时为对应分片库中所有分片表的集合 tablesNames(是表名的集合，比如product_order_0)
     *
     * @param shardingValue  分片属性，包括
    *                                  logicTableName 为逻辑表，
    *                                  columnName 分片健（字段），
    *                                  value 为从 SQL 中解析出的分片健的值
     * @return
     */
    @Override
    public String doSharding(Collection<String> dataSourceNames, PreciseShardingValue<String> shardingValue) {

        // 获取逻辑表名（因为配置文件中的actual-data-nodes属性的表都是short_link逻辑表，所以只能获取逻辑表，除非配置文件那全写）
        String targetName = dataSourceNames.iterator().next();
        // 获取短链码
        String shortLink = shardingValue.getValue();
        //获取短链码最后一位
        String shortLinkSuffix = shortLink.substring(shortLink.length()-1);
        // 逻辑表名 拼接 短链码最后一位
        return targetName + "_" + shortLinkSuffix;
    }
}
